package multithreading;

public class Demo1_Multithreading {
    /**
     * 几个概念
     *   程序：数据结构+算法 用某种语言编写的一组指令的集合
     *        指的就是一段静态的代码。不管这段代码能否正确执行
     *   进程：是程序的一次执行过程
     *   对比案例：money  钱放在那不花就是纸，用钱交换商品过程
     *
     *   线程：进程可以进一步细化为线程，是一个程序内部的一条执行路径
     *   并行：同一时刻多个CPU同时执行多个任务
     *   并发：一个CPU内，同时执行多个任务
     *      时间片：时间轮询
     *
     *   多线程举例
     *     迅雷下载
     *       一次只能下载一个文件，单线程
     *       一次可以同时下载多个文件，多线程
     *     火车卖票
     *       一个售票点只有一个窗口卖票，单线程
     *       一个售票点同时有多个窗口卖票，多线程
     *
     *   java代码
     *     只要启动java虚拟机就会自动启动一个线程，就是主线程(main方法)
     *     同时执行两段代码是启动了两个java虚拟机，是两个独立的进程，不属于多线程执行
     *
     *   创建线程的方式
     *     extends Thread
     *     implements Runnable
     *
     *   共享资源会产生资源恶性竞争的问题，对使用者的直观感受就是数据是乱的是错误的
     *   解决这个问题的方式：加锁
     *     同步块/同步锁(方法):同一个时刻只允许一个线程执行块(方法)中的代码
     *     哪个线程拿到了这个对象(this)这个线程执行代码。其他线程只能等待
     *
     *     这个对象指的monitor(监视器)
     *
     *  线程的生命周期
     *    新生
     *      创建线程，但是还没有真正执行，可以通过start方法让线程执行
     *    就绪
     *      所有的状态都达到了运行的标准，但是还没有真正运行
     *      start方法之后线程会进行入到就绪队列等待运行
     *    运行
     *      一个线程正在运行的状态
     *    阻塞
     *      某个正在运行的线程由于某种特殊原因不能继续执行了，进入阻塞状态
     *      阻塞状态达到运行条件后，也不能马上进入运行状态，必须进入就绪队列等待运行
     *      1.sleep   可以指定线程阻塞的时间
     *      2.join    主线程等待，直到其他线程执行完毕，主线程才可以运行
     *      3.锁机制   当前线程被锁定，其他线程被阻塞状态，等待锁释放
     *      4.I/O     关于IO操作的时候也可能发生阻塞状态
     *      5.等待通知 根据实际情况的具体条件当前线程自己决定进入阻塞态
     *    消亡
     *      线程进入了消亡状态，一旦进入消亡状态就不可再运行
     *      该执行的代码都执行完毕可以进入消亡状态
     *      JVM 关闭 线程也就消亡了
     *    锁池
     *      在运行状态中的线程如果抢占到锁了，其他线程都要进入锁池状态
     *      目的是在进入就绪状态前要从多个线程中抢占锁资源，抢到的线程才可以进入就绪状态
     *
     */

    public static void main(String[] args) {
        //主方法运行的就是一个线程，叫做主线程
        System.out.println(Thread.currentThread().getName());
    }
}
